/*
 * canttchartscene.h
 * 甘特图场景头文件
 * 定义了甘特图的场景类，负责管理时间轴、网格线和时间条项
 */
#ifndef CANTTCHARTSCENE_H
#define CANTTCHARTSCENE_H

#include <QGraphicsScene>
#include <QDateTime>
#include <QTime>
#include <QHash>
#include <QPair>

class CanttTimeBarItem;

/**
 * @class CanttChartScene
 * @brief 甘特图场景类
 * @details 继承自QGraphicsScene，负责管理甘特图的坐标轴、网格线和时间条项，
 *          处理时间轴范围设置和时间条的添加
 */
class CanttChartScene : public QGraphicsScene
{
    Q_OBJECT
public:    
    /**
     * @brief 构造函数
     * @param parent 父对象指针，默认为0
     */
    explicit CanttChartScene(QObject *parent = 0);

    /**
     * @brief 设置时间轴范围
     * @param start 开始时间
     * @param end 结束时间
     * @param platforms 平台列表
     */
    void setAxisRange(const QDateTime &start, const QDateTime &end, const QStringList &platforms);

    /**
     * @brief 添加计划时间条
     * @param platform 平台名称
     * @param start 开始时间
     * @param end 结束时间
     * @return 返回创建的时间条项
     */
    CanttTimeBarItem *addPlanTimeBar(const QString &platform, const QDateTime &start, const QDateTime &end);

    /**
     * @brief 添加实际时间条
     * @param platform 平台名称
     * @param start 开始时间
     * @param end 结束时间
     * @return 返回创建的时间条项
     */
    CanttTimeBarItem *addRealTimeBar(const QString &platform, const QDateTime &start, const QDateTime &end);

    /**
     * @brief 设置时间步长值
     * @param time 时间步长
     */
    void setStepTimeValue(const QTime &time);

private:
    /**
     * @brief 绘制网格线
     */
    void drawGridLines();

    /**
     * @brief 绘制垂直坐标轴
     * @param platforms 平台列表
     */
    void drawVerticalAxis(const QStringList &platforms);

    /**
     * @brief 行数
     */
    int m_rowCount;

    /**
     * @brief 列数
     */
    int m_columnCount;

    /**
     * @brief 开始时间
     */
    QDateTime m_startDateTime;

    /**
     * @brief 结束时间
     */
    QDateTime m_endDateTime;

    /**
     * @brief 时间步长值
     */
    QTime m_stepTimeValue;

    /**
     * @brief 平台列表
     */
    QStringList m_platforms;

    /**
     * @brief 第一个时间条的起始X坐标
     */
    int m_firstTimeBarStartX;

    /**
     * @brief 第一个时间条的起始Y坐标
     */
    int m_firstTimeBarStartY;

    /**
     * @brief 每像素对应的毫秒数
     */
    double m_perPixelHMsecs;

    /**
     * @brief 平台起始Y坐标哈希表
     */
    QHash<QString, double> m_platformStartYHash;

    /**
     * @brief 计划时间条临时哈希表
     */
    QHash<QString, QPair<QDateTime, QDateTime>> m_planTimeBarTemp;

    /**
     * @brief 实际时间条临时哈希表
     */
    QHash<QString, QPair<QDateTime, QDateTime>> m_realTimeBarTemp;

    /**
     * @brief 平台时间条哈希表
     */
    QMultiHash<QString, QGraphicsItem*> m_plaformTimeBarHash;
};

#endif // CANTTCHARTSCENE_H
